1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <cstdio> #include <algorithm> #include <map> const int maxn = 1e5 + 5; const int mo = 998244353; using namespace std; int n, k, a[maxn], tmp[maxn], fac[maxn], inv[maxn]; int pow(int x, int t){ int res = 1; x %= mo; while (t > 0){ if (t & 1) res = 1ll * res * x % mo; x = 1ll * x * x % mo; t >>= 1; } return res; } int C(int n, int m){ if (m == 0 || m == n) return 1; if (m > n || m < 0) return 0; return 1ll * fac[n] * inv[n - m] % mo * inv[m] % mo; } int f(int l, int r){ if (l > r) return 0; int x = lower_bound(tmp + 1, tmp + n + 1, l) - tmp; int y = upper_bound(tmp + 1, tmp + n + 1, r) - tmp; return y - x; } int main(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) scanf("%d", a + i), tmp[i] = a[i]; fac[0] = 1; for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % mo; inv[n] = pow(fac[n], mo - 2); for (int i = n - 1; i >= 1; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % mo; sort(tmp + 1, tmp + n + 1); for (int i = 1; i <= n; i++){ if (a[i] == 0) printf("%d\n", C(n, k)); else{ int ans = (C(n - 1 - f((a[i] + 1) / 2, a[i] - 1), k) + C(n - f(a[i], a[i] * 2 - 1), k - f(a[i], a[i] * 2 - 1))) % mo; printf("%d\n", ans); } } return 0; }
|